#ifndef _POKEMON_STRUCT_H_
#define _POKEMON_STRUCT_H_

#define UI_SOUND_3				(1)
/***********************************************************************
***********************************************************************/
#define PHC_COURSE_NAME_SIZE	(40)
#define PHC_TRAINER_NAME_SIZE	(7*2)
#define PHC_PARENT_NAME_SIZE	(7*2)
#define PHC_NICKNAME_SIZE		(10*2)
#define PHC_EOF_SIZE			(2)
/***********************************************************************
***********************************************************************/
typedef enum{ // ROM バージョン
  ROM_VERSION_UNKNOWN = 0,
	ROM_VERSION_GS_GOLD,
	ROM_VERSION_GS_SILVER,
	ROM_VERSION_GS_COLOR3,
	ROM_VERSION_NEW_COLOR1,
	ROM_VERSION_NEW_COLOR2,
	ROM_VERSION_NEW_COLOR3,
	ROM_VERSION_NUM
}PHCRomVersion;

typedef enum{ // 言語バージョン
  PHC_LANG_UNKNOWN = 0,
	PHC_LANG_JAPANESE,
	PHC_LANG_ENGLISH,
	PHC_LANG_FRANCH,
	PHC_LANG_ITALIAN,
	PHC_LANG_GERMAN,
	PHC_LANG_RESERVED,
	PHC_LANG_SPANISH,
	PHC_LANG_CORIAN,
	PHC_LANG_NUM
}PHCLangVersion;
/***********************************************************************
OS_GetLowEntropyData: 32バイトOS_GetOwnerRtcOffset: 8バイト
***********************************************************************/
#define PHC_ID_LEN	(40)
/***********************************************************************
通信の最初にやりとりする情報
***********************************************************************/
typedef struct{ // 端末に関する情報
  /*********************************************************************
  *********************************************************************/
  u32 country;				// 登録DS国バージョン(言語バージョン)
  u32 country_poke;			// 保持ポケモン国バージョン

  u16 romVersion;			// 登録DSロムバージョン
  u16 romVersion_poke;		// 保持ポケモンROMバージョン
  /*********************************************************************
  *********************************************************************/
  u32 trainerId;
  u8 PHCUniqueId[PHC_ID_LEN];
  /*********************************************************************
  *********************************************************************/
  u8 eventReceiveFlag[16];	// イベント受け取りフラグ(DS側はセット不要)
  u8 trainerName[PHC_TRAINER_NAME_SIZE+PHC_EOF_SIZE];		// トレーナー名

  u8 padding[2]; // 2バイト減ったので

  u8 distributeNumber;		// 配布用のデータであった場合、配布の番号を示す

  u8 entryFlag:1;		// 登録状態フラグ(1bit)
  u8 pokeFlag:1;				// 保持ポケモンフラグ
  u8 pokeAutoGenerateFlag:1;	// 保持ポケモン自動生成フラグ(DS側はセット不要)

  u8 dayResetTime:5;			// 0-23(5ビット) DAY歩数クリア・経過日数を実行する時間(0 が真夜中の12時)
  /*********************************************************************
  *********************************************************************/
  u8 com_phc2phc_version;			// PHC 同士の通信バージョン(これが異なると通信不可) 2009/03/10
  u8 com_ds2phc_version;		// プレゼント通信のバージョン(これが異なると通信不可) 2009/03/10

  // ↑と兼用してもよいがパディングがあるなら分けて設定(DS はセット不要)
  u8 phc_major_version;			// これがPHC のファームバージョンを示す。現状特に使用してない(DS の参照可)
  u8 phc_minor_version;			// これは識別に使う。DSとの通信ではcom_ds2phc_version と比較する(DS の参照可)
  /*********************************************************************
  big andian
  *********************************************************************/
  u32 rtcSecond; //u8 rtcSecond [4]; // 2000年からの経過秒数: 100年以上持つ(ライブラリがセット)
  u32 totalStep; // その時点でのPHC のトータル歩数
  /*********************************************************************
  センサ等調整パラメータ
  *********************************************************************/
#if 0 // やはりメリットよりデメリットが多そう
  u16 sensitivity_step;			// 歩数検知の閾値(512)
  u16 sensitivity_sleep;		// スリープ復帰の閾値(30) (255*3+1) 以上にするとロック状態になる
#endif
}PHCStatus;
/***********************************************************************
***********************************************************************/
typedef struct{
  u16	adrs;		// 先頭からのオフセット
  u8	size;		// データのサイズ(最大192バイト)
  u8	sum;		// 簡易チェックサム
}PHCSoundHeader;
/***********************************************************************
***********************************************************************/
typedef struct{
  PHCSoundHeader header[16]; // 16曲のここからのオフセット
  u8 data[512-16*sizeof(u16)];	// 16曲で合計: 448バイト
}PHCSoundData;
/***********************************************************************
フォントグラフィックデータ
インタフェース画面データ
メイン画面データ
メニュー画面素材データ
ステータス画面データ
設定画面データ
アイテム確認画面素材データ
ダウジング画面素材データ
ポケトレ画面素材データ
バトル画面素材データ
通信画面素材データ
占い画面素材データ
デモ画面素材データ
エンディング素材データ
各画面メッセージグラフィックデータ
***********************************************************************/
typedef struct{
  /*********************************************************************
  フォントグラフィックデータ
  *********************************************************************/
  u8 font[32*(10+3)];	// 0-9 : / - の13文字(8x16)
  u8 watt[64];			// ワット(16x16)
  //u8 win[16*8];			// ウインドウフレーム
  /*********************************************************************
  インタフェース画面データ dist = distribute(配布する)
  *********************************************************************/
  u8 ball[16], ballDist[16], ballMask[8];
  u8 treasure[16], treasureDist[16];
  u8 mapDist[16], stampDist[16*4];

  u8 arrow[16*3*4]; // 3パターン4方向
  u8 arrowBig[32*(2*2)]; // 2009/02/05 1パターン2種類x2方向(8x16)

  u8 next_cursor[16];		// 2009/02/05 キー送りアイコン
  u8 next_cursor_mask[8];	// 2009/02/05 キー送りアイコンマスク

  u8 present[16]; // (8x8)
  u8 battery[16]; // (8x8)
  /*********************************************************************
  メイン画面データ
  *********************************************************************/
  u8 feeling[96*7]; // 吹き出しアイコン(24x16)*7
  /*********************************************************************
  メニュー画面素材データ
  *********************************************************************/
  u8 list[320*6];	// メニュー項目名(80x16)*6
  u8 icon[64*6];	// メニューアイコン(16*16)*6
  /*********************************************************************
  ステータス画面データ
  *********************************************************************/
  u8 iconName[64];	// (16x16)
  u8 name[320];		// (80x16)
  u8 course[64];	// (16x16)
  u8 step[160];		// (40x16)
  u8 am_pm[128];	// 時間一つになった //u8 am_pm[256];	// (32x16)x2
  u8 dayPass[160];	// (40x16)
  u8 dayTotal[256];	// (64x16)
  /*********************************************************************
  設定画面データ
  *********************************************************************/
  u8 volume[160];	// (40x16)
  u8 contrast[160];	// (40x16)
#if UI_SOUND_3==1 // サウンドボリュームが3段階の場合
  u8 se_off[96], se_on[96], se_on2[96]; // (24x16)
#else
  u8 se_on[96], se_off[96];	// (24x16)
#endif
  u8 meter[32];		// (8x16)
  /*********************************************************************
  アイテム確認画面素材データ
  *********************************************************************/
  u8 itemTreasure[192];	// (32*24)
  u8 itemMap[192];		// (32*24)
  u8 itemPresent[192];	// (32*24)
  /*********************************************************************
  ダウジング画面素材データ
  *********************************************************************/
  u8 grass[64];			// (16*16)
  u8 grassLight[64];	// (16*16)
  u8 rest[128];	// 		// (32*16)
  u8 kai[96];	// 		// (24*16)
  /*********************************************************************
  ポケトレ画面素材データ
  *********************************************************************/
  u8 ptGrass[192];		// (32*24)
  u8 ptIcon[64*4];		// !, !!, !!!, 成功(16*16)
  /*********************************************************************
  バトル画面素材データ
  *********************************************************************/
  u8 attack[128];		// (16*32)
  u8 weakPoint[128];	// (16*32)
  u8 gas[192];			// (32*24)
  u8 battleMeter[16];	// (8*8)
  u8 star[16];			// (8*8)
  u8 battleMenu[384*2];	// (96*16)*2 上下2枚に分かれている
  /*********************************************************************
  通信画面素材データ
  *********************************************************************/
  u8 phc[256];			// (32*32)
  u8 radio[32];			// (8*16)
  u8 note[16];			// (8*8)
#if 0 // 通信の無駄なので別領域を使う
  u8 enemy[192];		// (32*24) // DS はセットしなくてよい
  u8 pokeName[320];		// (80*16) // DS はセットしなくてよい
#endif
  /*********************************************************************
  デモ画面素材データ
  *********************************************************************/
  u8 pokeShadow[16];	// 2009/02/05 残像
  /*********************************************************************
  エンディング画面素材データ
  *********************************************************************/
  u8 ending[160];		// 「じかん」のアイコン: (40*16)
  /*********************************************************************
  各画面メッセージグラフィックデータ(22番目が空いてる)
  *********************************************************************/
  u8 message[384*69]; //u8 message[384*71];	// (96*16)*60
  /*********************************************************************
  *********************************************************************/
  PHCSoundData soundData; // 512 バイト
}PHCImageData;

/***********************************************************************
フォルムと性別を１バイトにまとめるとアライメント上都合がいい
***********************************************************************/
typedef struct{
  u16	id;				// ポケモンの種類
  u16	item;			// 保持アイテム
  u16	skill[4];		// 技リスト
  u8	level;			// レベル

  u8	folm:5;			// フォルムナンバー
  u8	sex:2;			// 性別
  u8	isEgg:1;		// タマゴフラグ

  u8	reverseFlag:1;	// 反転フラグ
  u8	rareColor:1;	// レアカラー
  u8	padding[1];
}PHCPokemonBase;
/***********************************************************************
保持ポケモンデータ(引き取り時使用)
***********************************************************************/
typedef struct{ //
  PHCPokemonBase pokemon; // 16 バイト
  u8 nickname[PHC_NICKNAME_SIZE+PHC_EOF_SIZE];		// ニックネーム
  u8 friendly;			// なつき度
  u8 padding0[3];
}PHCRentalData;
/***********************************************************************
コースデータ
***********************************************************************/
typedef struct{ // 変数だけをメモリにロードできるように分ける
  /*********************************************************************
  保持ポケモンデータ
  *********************************************************************/
  PHCPokemonBase pokemon; // 16 バイト
  u8 nickname[PHC_NICKNAME_SIZE+PHC_EOF_SIZE];		// ニックネーム
  u8 friendly;			// なつき度
  /*********************************************************************
  コースデータ
  *********************************************************************/
  u8 courseId;
  u8 courseNameString[PHC_COURSE_NAME_SIZE+PHC_EOF_SIZE];	// 必要？
  // ここまでで4バイト境界
  PHCPokemonBase Enemy[3]; // そのマップで出現するポケモンのデータ
  u16 walkStep[3];
  u8 encountRate[3];
  u8 padding1[1];
  /*********************************************************************
  アイテムデータ
  *********************************************************************/
  u16 itemNumber[10];
  u16 itemStep[10];		// アイテムを取得するのに必要な歩数
  u8 itemRate[10];		// アイテムの出現確率
}PHCCourseValue;

typedef struct{
  PHCCourseValue v;
  /*********************************************************************
  画像データ
  *********************************************************************/
  u8 course[192];		// (32*24)*1
  u8 courseName[320];	// (80*16)

  u8 imagePoke[768/2];
  u8 imagePokeBig[(64*48/4)*2];			// 高解像度ポケモン(1536バイト)
  u8 pokeName[320];		// (96*16)

  u8 imageEnemy[(768/2)*3];
  u8 imageEnemyBig[(64*48/4)*2];		// 高解像度ポケモン(1536バイト): 自動生成用なのでコースの3番目のポケモンのみ
  u8 enemyName[320*3];		// (96x16)

  u8 item[384*10];			// アイテムの名前グラフィック(96*16)
}PHCCourseData;
/***********************************************************************
レコードデータ
***********************************************************************/
typedef struct{
  u32	country;
  u16	romVersion;

  u16	padding;

  u8	id[PHC_ID_LEN];
  u8	record[500];
}DSRecordData;
/***********************************************************************
PokemonBase になくて配布ポケモンと配布ボーナスコース内ポケモンに必要なもの
***********************************************************************/
typedef struct{
  u32 	country;		// 配布コースデータの国バージョン
  u32	parentId;		// 親のID
  u16 	romVersion;		// 配布コースデータのROMバージョン
  // u16	item;		// 所持アイテムはPHCPokemonBase にあるので不要

  u16	country_poke;
  u16	eggCountry;

  u8	parentName[PHC_PARENT_NAME_SIZE+PHC_EOF_SIZE]; // 16バイト

  u8	parentSex:1;	// 親の性別
  u8	characteristic;	// ポケモンの特性
  /*********************************************************************
  *********************************************************************/
  u8	getBall;
  u8	getTime[3];
  /*********************************************************************
  *********************************************************************/
  u8	reserve[8];		// 予約領域
  // 配布フラグ
}PHCPokemonInfo;
/***********************************************************************
***********************************************************************/
typedef struct{
  u16	ID;
  u8	entryNumber;	// PHC 登録順番号
  u8	padding[1];
}PHCItem;
/***********************************************************************
日記データ
***********************************************************************/
typedef struct{
  u32	rtcSecond; // DS では64bit だが、１００年持つので32bit で // u8	hour, minute, second;

  u32	country;	// 通信相手の国バージョン
  /*********************************************************************
  *********************************************************************/
  u16	romVersion;	// 通信相手のROM バージョン

  u16	pokeNumber;
  u16	enemyNumber;
  u16	itemNumber;
  /*********************************************************************
  *********************************************************************/
  u8	trainerName[PHC_TRAINER_NAME_SIZE+PHC_EOF_SIZE]; // 14+2: PHC通信の相手専用

  u8	myNickname[PHC_NICKNAME_SIZE+PHC_EOF_SIZE]; // 20+2
  u8	enemyNickname[PHC_NICKNAME_SIZE+PHC_EOF_SIZE]; // 20+2
  /*********************************************************************
  *********************************************************************/
  u8	courseNameString[PHC_COURSE_NAME_SIZE+PHC_EOF_SIZE];	// 40+2 2009/2/3 追加
  u8	courseId;
  u8	friendly;			// なつき度
  /*********************************************************************
  *********************************************************************/
  u16	myStepHour;
  u16	yourStepHour;
  /*********************************************************************
  *********************************************************************/
  u32	myStepDay;		// この区画8バイト
  u32	yourStepDay;
  /*********************************************************************
  *********************************************************************/
  u8	actionId;

  u8	myFolm:5;
  u8	mySex:2;
  u8	myRareColor:1;	// レアカラー

  u8	yourFolm:5;
  u8	yourSex:2;
  u8	yourRareColor:1;	// レアカラー

  u8	padding0[1]; // こっちもフォルムを1バイトにする？
}PHCDiary;
/***********************************************************************
PHC 内作成データ
***********************************************************************/
typedef struct{
  /*********************************************************************
  トータル歩数を消さない場合に同期して残すデータ
  *********************************************************************/
  u32 past_hour; // 経過時間データ
  u32 endingTime;

  u8 endingFlag:1;
  u8 padding;
  /*********************************************************************
  *********************************************************************/
  u16 watt;
  /*********************************************************************
  *********************************************************************/
  PHCPokemonBase pokemon[3];

  PHCItem item[3];				// ダウジングで取得したアイテム
  PHCItem itemFriend[10];		// PHC 同士の通信で取得したアイテム

  // 歩数データ 24 バイト
  u32 stepWeek[7]; // u8 stepWeek[7][3];

  PHCDiary diary[24]; 			// 日記データ(コーステンポラリとして破壊される)
}PHCData;
/***********************************************************************
配布地図に３つor10個あって配布コースに１つあるものを共通化
***********************************************************************/
typedef struct{
  u16 pokeStep;			// 配布ポケモン出現歩数
  u8 pokeRate;			// 配布ポケモン出現確率
  u8 padding[1];
}PHCPokemonCondition; // 取得条件

typedef struct{
  u16 itemNumber;		// 出現するアイテム番号
  u16 itemStep;			// 配布アイテム出現歩数
  u8 itemRate;			// 配布アイテム出現確率
  u8 padding[3];
}PHCItemCondition; // 取得条件
/***********************************************************************
配布地図データ
***********************************************************************/
typedef struct{
  u32 country;
  u16 romVersion; // ロムバージョン
  u8 mapId;					// マップID 12/26 追加
  u8 courseId;				// 背景ID 12/26 追加
  /*********************************************************************
  *********************************************************************/
  PHCPokemonBase pokemon[6];
  PHCPokemonCondition pokemonCondition[6];	// 4バイト: 配布マップに３つあって配布コースに１つあるもの
  PHCItemCondition itemCondition[10];		// 8バイト: 配布マップに10個あって配布コースに１つあるもの
  /*********************************************************************
  *********************************************************************/
  u8 courseNameString[PHC_COURSE_NAME_SIZE+PHC_EOF_SIZE];	// 配布の場合は必要だと思われる
  u8 profitable[3];			// 有利属性
  u8 padding[3];
  /*********************************************************************
  画像データ
  *********************************************************************/
  u8 courseName[320];	// (80*16) コース名グラフィック
}PHCDistributeMap;
/***********************************************************************
配布ポケモンデータ
***********************************************************************/
typedef struct{
  /*********************************************************************
  *********************************************************************/
  PHCPokemonBase pokemon;	// 16 バイト 所持アイテムはこの中
  PHCPokemonInfo pokeInfo; // country, romVersion はこの中
  /*********************************************************************
  ポケモングラフィック
  *********************************************************************/
  u8 imagePoke[768/2];
  u8 pokeName[320];		// (96*16)
}PHCDistributePokemon;
/***********************************************************************
配布アイテムデータ
***********************************************************************/
typedef struct{
  u32 country;
  u16 romVersion;
  /*********************************************************************
  *********************************************************************/
  u16 itemNumber;
  u8 itemName[384];
}PHCDistributeItem;
/***********************************************************************
***********************************************************************/
typedef struct{
  u8	stamp:4;				// 配布スタンプ
  u8	isMap:1;				// 配布マップを取得しているか
  u8	isPokemon:1;			// 配布ポケモンを取得しているか
  u8	isItem:1;				// 配布アイテムを取得しているか
  u8	isCourse:1;				// 配布ボーナスコースを取得しているか
  u8	padding[3];
}PHCDistributeInfo;
/***********************************************************************
DS に配布データをまとめて返すため(ボーナスコースは返さなくてよい)
***********************************************************************/
typedef struct{
  PHCDistributeInfo		info;		// 配布情報
  PHCDistributeMap		map;		// 配布マップ
  PHCDistributePokemon pokemon;		// 配布ポケモン
  PHCDistributeItem	item;			// 配布アイテム
}PHCDistributeData;
/***********************************************************************
配布ボーナスコースデータのパラメータ部分
***********************************************************************/
typedef struct{
  u32 country;
  u16 romVersion; // ロムバージョン
  u8 courseId;				// 背景ID 12/26 追加
  u8 padding[1];					//
  /*********************************************************************
  *********************************************************************/
  PHCPokemonBase pokemon;	// 16 バイト
  PHCPokemonInfo pokeInfo; //  バイト

  PHCPokemonCondition pokemonCondition; // 4 バイト 配布マップに３つあって配布コースに１つあるもの
  PHCItemCondition itemCondition; // 8 バイト 配布マップに３つあって配布コースに１つあるもの
  /*********************************************************************
  *********************************************************************/
  u8 courseNameString[PHC_COURSE_NAME_SIZE+PHC_EOF_SIZE];	// 配布の場合は必要だと思われる
  u8 pokeFlagNumber;
  u8 itemFlagNumber;
}PHCDistributeCourseValue;
/***********************************************************************
配布ボーナスコースデータ
***********************************************************************/
typedef struct{
  PHCDistributeCourseValue v;
  /*********************************************************************
  画像データ
  *********************************************************************/
  u8 imagePoke[768/2];
  u8 imagePokeBig[(64*48/4)*2];			// 高解像度ポケモン(1536バイト)
  u8 pokeName[320];		// (96*16)
  u8 course[192];		// (32*24) コースグラフィック
  u8 courseName[320];	// (80*16)
  u8 itemName[384];
}PHCDistributeCourse;

#endif